package electronicaDonPepe.comisiones.dataAccess.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;

import electronicaDonPepe.comisiones.dataAccess.Dao;

abstract class DaoBase<T> implements Dao<T> {

	protected HibernateTemplate hibernateTemplate;

	@Override
	public void create(T entity) {
		if(entity == null){
			throw new IllegalArgumentException("El parametro 'entity' no puede ser nulo");
		}
		hibernateTemplate.save(entity);
	}

	@Override
	public void delete(T entity) {
		if(entity == null){
			throw new IllegalArgumentException("El parametro 'entity' no puede ser nulo");
		}
		hibernateTemplate.delete(entity);
	}

	@Override
	public void update(T entity) {
		if(entity == null){
			throw new IllegalArgumentException("El parametro 'entity' no puede ser nulo");
		}
		hibernateTemplate.update(entity);
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<T> findByExample(T entity) {
		if(entity == null){
			throw new IllegalArgumentException("El parametro 'entity' no puede ser nulo");
		}
		return hibernateTemplate.findByExample(entity);
	}

	@SuppressWarnings("unchecked")
	protected List<T> getAll(Class<?> clazz) {
		return (List<T>) hibernateTemplate.loadAll(clazz);
	}

	@SuppressWarnings("unchecked")
	protected T getById(Class<?> aClass, Serializable id) {
		if(id == null){
			throw new IllegalArgumentException("El parametro 'entity' no puede ser nulo");
		}
		T ret = (T) hibernateTemplate.get(aClass, id);
		return ret;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		if(sessionFactory == null){
			throw new IllegalArgumentException("SessionFactory no puede ser null, revise la configuracion del bean en el applicationContext");
		}
		this.hibernateTemplate = new HibernateTemplate(sessionFactory);
	}
	
	public List find(String hql) {	
		return hibernateTemplate.find(hql);
	}
}
